
###########################################################################
#  1. 使用openwrt的编译体系的Makefile来编译及组织farm的项目
#  2. 如果您只基于farm的标准方式开发项目, 不建议你修改或学习使用此文档
#  3. 如果您对此文档感兴趣, 更详细的文档可以对照Openwrt的Makefile的学习
###########################################################################

# 包含一些Openwrt的编译函数
include $(TOPDIR)/rules.mk

# 定义项目名称
PROJECT_ID:=ifname
# 包名称(基于PROJECT_ID定义)
PKG_NAME:=${PROJECT_ID}
export PROJECT_ID
# Makefile版本号
PKG_RELEASE:=1
# 项目的注册信息
LIB_LIST := $(shell fpk-read lib)
COM_LIST := $(shell fpk-read com)
EXE_LIST := $(shell fpk-read exe)
OSC_LIST := $(shell fpk-read osc)
RES_LIST := $(shell fpk-read res)
MOD_LIST := $(shell fpk-read mod)
MISC_LIST := $(wildcard *.json *.cfg *.sh *.html )
INTRO_STR := $(shell fpk-read intro)
DESC_STR := $(shell fpk-read desc)
VERSION_ID := $(shell fpk-read version)
# 包版本号(基于VERSION_ID定义)
PKG_VERSION:=${VERSION_ID}
export VERSION_ID
# 包编译时的目录
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
FPK_BUILD_DIR:=$(PKG_BUILD_DIR)/.fpk
FPK_LIB_DIR:=$(FPK_BUILD_DIR)/lib
FPK_BIN_DIR:=$(FPK_BUILD_DIR)/bin
FPK_ROOTFS_DIR:=$(FPK_BUILD_DIR)/rootfs
# 包含Openwrt的一些有关包处理的函数
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/kernel.mk
# 包含farm项目的一些有关包处理的函数
sinclude ${gMAKEFILE_LIBFILE}

# menuconfig的选项的位置及说明
define Package/$(PKG_NAME)
  CATEGORY:=Farm system
  TITLE:=$(INTRO_STR)
  DEPENDS:=+land +network
endef
# menuconfig的界面上的帮助
define Package/$(PKG_NAME)/description
  $(INTRO_STR):$(DESC_STR)
endef

# 编译前准备工作, 通常会将代码先拷贝到PKG_BUILD_DIR中的包同名目录下去准备编译
define Build/Prepare
	@if [ "X" == "X${VERSION_ID}" ];then \
		echo "project ${PROJECT_ID} version cannot find, maybe ${gPROJECT_INF} break"; \
		exit -1; \
	fi
	@mkdir -p $(PKG_BUILD_DIR)
	@for i in  ${LIB_LIST} ${COM_LIST} ${EXE_LIST} ${OSC_LIST} ${MOD_LIST} ;do \
		if [ -e $$$$i ];then \
			$(CP) $$$$i $(PKG_BUILD_DIR); \
		fi; \
	done
	# ########## 在此可添加额外的准备工作指示 ########### #
endef

# 编译, Build/MakeCom表示编译一个组件
# 编译, Build/MakeLib表示编译一个库
# 编译, Build/MakeExe表示编译一个可执行程序
# 编译, Build/MakeOsc表示编译一个开源程序
define Build/Compile
	$(FIND) $(PKG_BUILD_DIR) -name \*.o -or -name \*.a | $(XARGS) rm -f
	$(call Build/MakeLib,${LIB_LIST})
	$(call Build/MakeCom,${COM_LIST})
	$(call Build/MakeExe,${EXE_LIST})
	$(call Build/MakeOsc,${OSC_LIST})
	$(call Build/MakeMod,${MOD_LIST})
	# ########## 在此可添加额外的编译指示 ########### # 
endef
# 安装库及头文件到编译体系中以便其它的程序引用及链接
define Build/InstallDev
	@$(INSTALL_DIR) $(1)/usr/include
	@$(INSTALL_DIR) $(1)/usr/lib
	@for i in ${LIB_LIST} ;do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			$(INSTALL_DIR) $(1)/usr/include/$$$$i; \
			$(CP) $(PKG_BUILD_DIR)/$$$$i/*.h $(1)/usr/include/$$$$i; \
			$(CP) $(PKG_BUILD_DIR)/$$$$i/lib*.so $(1)/usr/lib; \
			$(LN) lib$$$$i.so $(1)/usr/lib/lib$$$$i.so.0; \
		fi; \
	done
endef

# 安装到系统运行目录中( 注意必须要有这个函数才会执行Build/Compile )
define Package/$(PKG_NAME)/install
	# make the fpk dir
	$(INSTALL_DIR) $(FPK_BUILD_DIR)
	$(INSTALL_DIR) $(FPK_LIB_DIR)
	$(INSTALL_DIR) $(FPK_BIN_DIR)
	for c in $(MISC_LIST) ${RES_LIST}; do \
		if [ -e ./$$$$c ]; then \
			$(CP) $$$$c $(FPK_BUILD_DIR); \
		fi; \
	done
	for i in ${COM_LIST};do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			$(CP) $(PKG_BUILD_DIR)/$$$$i/$$$$i.com $(FPK_BUILD_DIR); \
		fi; \
	done
	for i in ${OSC_LIST};do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			if [ -e $(PKG_BUILD_DIR)/$$$$i/$$$$i ];then \
				$(INSTALL_BIN) $(PKG_BUILD_DIR)/$$$$i/$$$$i $(FPK_BUILD_DIR); \
			fi; \
		fi; \
	done
	for i in ${LIB_LIST};do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			$(CP) $(PKG_BUILD_DIR)/$$$$i/lib$$$$i.so $(FPK_LIB_DIR); \
			$(LN) lib$$$$i.so $(FPK_LIB_DIR)/lib$$$$i.so.0; \
		fi; \
	done
	for i in ${EXE_LIST};do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			if [ -e $(PKG_BUILD_DIR)/$$$$i/$$$$i ];then \
				$(INSTALL_BIN) $(PKG_BUILD_DIR)/$$$$i/$$$$i $(FPK_BIN_DIR); \
			fi; \
		fi; \
	done
	for i in ${MOD_LIST};do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			$(INSTALL_BIN) $(PKG_BUILD_DIR)/$$$$i/*.ko $(FPK_BUILD_DIR); \
		fi; \
	done
	$(RSTRIP) $(PKG_BUILD_DIR)/.fpk
	# install the develop link lib and head file to fpk
	$(INSTALL_DIR) $(PKG_BUILD_DIR)/.fpk/install
	$(INSTALL_DIR) $(PKG_BUILD_DIR)/.fpk/install/include
	for i in ${LIB_LIST} ;do \
		if [ -d $(PKG_BUILD_DIR)/$$$$i ];then \
			$(INSTALL_DIR) $(PKG_BUILD_DIR)/.fpk/install/include/$$$$i; \
			$(CP) $(PKG_BUILD_DIR)/$$$$i/*.h $(PKG_BUILD_DIR)/.fpk/install/include/$$$$i; \
			$(INSTALL_DIR) $(PKG_BUILD_DIR)/.fpk/install/lib; \
			$(CP) $(PKG_BUILD_DIR)/$$$$i/lib*.so $(PKG_BUILD_DIR)/.fpk/install/lib; \
			$(LN) lib$$$$i.so $(PKG_BUILD_DIR)/.fpk/install/lib/lib$$$$i.so.0; \
		fi; \
	done
	# ########## 在此可添加额外的安装指示 ########### # 
	# build the fpk
	cd $(PKG_BUILD_DIR)/.fpk;tar zcf $(PKG_BUILD_DIR)/${PROJECT_ID}-${VERSION_ID}-${gHARDWARE}.fpk *
	mv $(PKG_BUILD_DIR)/${PROJECT_ID}-${VERSION_ID}-${gHARDWARE}.fpk ${gBUILD_DIR}
endef

# 调用编译安装
$(eval $(call BuildPackage,$(PKG_NAME)))

